package org.mdrtwell.designpattern.behavioral.memento;

import java.util.ArrayList;
import java.util.List;

class Originator {
	private String	state;

	// The class could also contain additional data that is not part of the
	// state saved in the memento.

	public void set(String state) {
		System.out.println("Originator: Setting state to " + state);
		this.state = state;
	}

	public Memento saveToMemento() {
		System.out.println("Originator: Saving to Memento.");
		return new Memento(state);
	}

	public void restoreFromMemento(Memento memento) {
		state = memento.getSavedState();
		System.out.println("Originator: State after restoring from Memento: " + state);
	}

	public static class Memento {
		private final String	state;

		public Memento(String stateToSave) {
			state = stateToSave;
		}

		public String getSavedState() {
			return state;
		}
	}
}

class Caretaker {
	public static void main(String[] args) {
		List<Originator.Memento> savedStates = new ArrayList<Originator.Memento>();

		Originator originator = new Originator();
		originator.set("State1");
		originator.set("State2");
		savedStates.add(originator.saveToMemento());
		originator.set("State3");
		// We can request multiple mementos, and choose which one to roll back
		// to.
		savedStates.add(originator.saveToMemento());
		originator.set("State4");

		originator.restoreFromMemento(savedStates.get(1));
	}
}
